package org.example;


import java.util.Comparator;

class Card {
    public int rank; // 数值
    public String suit; // 花色
    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }

    // 根据数值比较，不管花色
    // 这里我们认为 null 是最小的
    /*@Override
    public int compareTo(Card o) {
        if (o == null) {
            return 1;
        }
        return rank - o.rank;
    }*/

    /*@Override
    public boolean equals(Object o) {
        // 自己和自己比较
        if (this == o) {
            return true;
        }
        // o如果是null对象，或者o不是Card的子类
        if (o == null || !(o instanceof Card)) {
            return false;
        }
        // 注意基本类型可以直接比较，但引用类型最好调用其equal方法
        // 这里比较rank是基本类型
        // 这里的suit是String类型，是引用类型，所以需要调用equals方法比较
        Card c = (Card)o;
        return rank == c.rank && suit.equals(c.suit);
    }*/
}

class CardComparator implements Comparator<Card> {

    // 根据数值比较，不管花色
    // 这里我们认为 null 是最小的

    @Override
    public int compare(Card o1, Card o2) {
        if (o1 == o2) {
            return 0;
        }
        if (o1 == null) {
            return -1;
        }
        if (o2 == null) {
            return 1;
        }
        return o1.rank - o2.rank;
    }
}

class TestPriorityQueue {

    public static void main(String[] args) {
        Card p = new Card(1, "♥");
        Card q = new Card(2, "♥");
        Card o = new Card(1, "♥");

        // 定义比较器对象
        CardComparator cmptor = new CardComparator();

        // 使用比较器对象进行比较
        System.out.println(cmptor.compare(p, o)); // == 0，表示牌相等
        System.out.println(cmptor.compare(p, q)); // < 0，表示 p 比较小
        System.out.println(cmptor.compare(q, p)); // > 0，表示 q 比较大
    }

    public static void main2(String[] args) {
        Card c1 = new Card(1, "♥");
        Card c2 = new Card(2, "♠");
        Card c3 = new Card(1, "♣");
        /*System.out.println(c1.compareTo(c2));
        System.out.println(c1.compareTo(c3));
        System.out.println(c2.compareTo(c1));*/
    }

    public static void main1(String[] args) {

        Object o1 = new Object();

        Card c1 = new Card(1, "♥");
        Card c2 = new Card(1, "♥");
        Card c3 = c1;
        //System.out.println(c1 > c2); // 编译报错
        System.out.println(c1 == c2); // 编译成功 ----> 打印false，因为c1和c2指向的是不同对象
     //System.out.println(c1 < c2); // 编译报错
        System.out.println(c1 == c3); // 编译成功 ----> 打印true，因为c1和c3指向的是同一个对象
    }
}